import {saveAs} from "file-saver";
import {CHANGE_BASE_URL} from "@/constants/localAndProd";

/**
 * 格式化展示文件大小
 * @param size
 */
export const formatSize = (size?: number) => {
    if(!size) return '未知';
    if(size < 1024) return size + ' B';
    if(size < 1024 * 1024) return (size / 1024).toFixed(2) + ' KB';
    if(size < 1000 * 1000 * 1000) return (size / (1024 * 1024)).toFixed(2) + ' MB';
    return (size / (1000 * 1000 * 1000)).toFixed(2) + ' GB';
}

/**
 * 下载图片
 * @param url 图片下载地址
 * @param fileName 要保存的文件名
 */
export function downloadImage(url?: string, fileName?: string) {
    if(!url) return;
    saveAs(url, fileName);
}


/**
 * 将后端传来的0xRRGGBB格式去掉0x
 * @param input
 */
export function toHexColor(input: string) {
    // 去掉 0x 前缀
    const colorValue = input.startsWith('0x') ? input.slice(2) : input

    // 将剩余部分解析为十六进制数，再转成 6 位十六进制字符串
    const hexColor = parseInt(colorValue, 16).toString(16).padStart(6, '0')

    // 返回标准 #RRGGBB 格式
    return `#${hexColor}`
}

/**
 * WebSocket 前端基础代码
 */
export default class PictureEditWebSocket {
    private pictureId: number
    private socket: WebSocket | null
    private eventHandlers: any

    constructor(pictureId: number) {
        this.pictureId = pictureId // 当前编辑的图片 ID
        this.socket = null // WebSocket 实例
        this.eventHandlers = {} // 自定义事件处理器
    }

    /**
     * 初始化 WebSocket 连接http://60.204.233.140
     */
    connect() {
        // 生产环境wss,开发环境ws
        const url = `ws://${CHANGE_BASE_URL}/api/ws/picture/edit?pictureId=${this.pictureId}`
        this.socket = new WebSocket(url)

        // 设置携带 cookie
        this.socket.binaryType = 'blob'

        // 监听连接成功事件
        this.socket.onopen = () => {
            console.log('WebSocket 连接已建立')
            this.triggerEvent('open')
        }

        // 监听消息事件
        this.socket.onmessage = (event) => {
            const message = JSON.parse(event.data)
            console.log('收到消息:', message)

            // 根据消息类型触发对应事件
            const type = message.type
            this.triggerEvent(type, message)
        }

        // 监听连接关闭事件
        this.socket.onclose = (event) => {
            console.log('WebSocket 连接已关闭:', event)
            this.triggerEvent('close', event)
        }

        // 监听错误事件
        this.socket.onerror = (error) => {
            console.error('WebSocket 发生错误:', error)
            this.triggerEvent('error', error)
        }
    }

    /**
     * 关闭 WebSocket 连接
     */
    disconnect() {
        if (this.socket) {
            this.socket.close()
            console.log('WebSocket 连接已手动关闭')
        }
    }

    /**
     * 发送消息到后端
     * @param {Object} message 消息对象
     */
    sendMessage(message: object) {
        if (this.socket && this.socket.readyState === WebSocket.OPEN) {
            this.socket.send(JSON.stringify(message))
            console.log('消息已发送:', message)
        } else {
            console.error('WebSocket 未连接，无法发送消息:', message)
        }
    }

    /**
     * 添加自定义事件监听
     * @param {string} type 消息类型
     * @param {Function} handler 消息处理函数
     */
    on(type: string, handler: (data?: any) => void) {
        if (!this.eventHandlers[type]) {
            this.eventHandlers[type] = []
        }
        this.eventHandlers[type].push(handler)
    }

    /**
     * 触发事件
     * @param {string} type 消息类型
     * @param {Object} data 消息数据
     */
    triggerEvent(type: string, data?: any) {
        const handlers = this.eventHandlers[type]
        if (handlers) {
            handlers.forEach((handler: any) => handler(data))
        }
    }
}

